This report aims to raise awareness about the tragic reality of child deaths caused by diarrhoea in children under the age of five. Although preventable and treatable condition, it remains one of the leading causes of child mortality in many low-income countries, where access to healthcare is limited.
The narrative voice of this report is that of Najir, a 4-year-old child who tells his story: from when he tells his mother he has a stomach ache, to when, despite efforts to find a cure, he sadly does not survive. Although this is a fictional story, it is plausible enough to reflect what happens in countries with low access to diarrhoea care, where the inadequacy of healthcare resources is tied to economic and social inequalities.
Data Sources
The data used in this report comes from the following datasets:
unicef_indicator_1.csv: provides global data on the percentage of children under five with diarrhoea who can access healthcare facilities
unicef_indicator_2.csv: offers global data on the percentage of healthcare facilities with basic water access
unicef_metadata.csv: includes economic and social data
deaths_caused_by_diarrhoea.csv: provides data on diarrhoea-related child mortality categorized by seven regions: North America, South Asia, Middle East and North Africa, Europe and Central Asia, Latin America and Caribbean, East Asia and Pacific, Sub-Saharan Africa. You can download it here.
Please find the Tableau version of this report here.
Najir’s Story
My name is Najir, and I am four years old.
I do not feel well. A sharp pain grips my stomach, and my mother tells me I have diarrhoea. She holds my hand tightly, her face etched with worry, her eyes filled with silent fear. “We must find help,” she says. However, seeking medical care is not a simple task.
I live in one of the nineteen countries where, according to data collected between 2017 and 2023, among all the children under the age of five suffering from diarrhoea, fewer than 40% have access to medical advice or treatment at a healthcare facility or from a trained provider.
Healthcare access for children with diarrhoea in lowest-access countries
Code
import pandas as pdfrom plotnine import ggplot, aes, geom_bar, labs, theme_minimal, theme, element_text, scale_fill_gradient, element_rectdf = pd.read_excel("unicef_indicator_1_filtered_firstgraph.xlsx")df['access to care for diarrhoea'] = df['access to care for diarrhoea'] *100bar_chart = ( ggplot(df, aes(x='country', y='access to care for diarrhoea', fill='access to care for diarrhoea')) + geom_bar(stat='identity', show_legend=False, width=0.35) + scale_fill_gradient(low='#D5006D', high='#FF80AB') + labs( x='Country', y='Access to Care for Diarrhoea (%)' ) + theme_minimal() + theme( figure_size=(8, 5), plot_background=element_rect(fill='#F5FBFF', color='#F5FBFF'), panel_background=element_rect(fill='#F5FBFF', color='#F5FBFF'), panel_grid_major=None, panel_grid_minor=None, axis_text_x=element_text(rotation=45, ha='right', size=10, color='#1F407A'), axis_text_y=element_text(size=8, color='#1F407A', weight='bold'), axis_title_x=element_text(size=12, color='#1F407A', weight='bold'), axis_title_y=element_text(size=10, color='#1F407A', weight='bold'), plot_title=element_text(size=0) ))bar_chart
A serious public health crisis is evident: limited accessibility and availability of essential healthcare services in specific areas of the world.
Despite being a preventable and treatable condition, diarrhoea remains one of the leading causes of child mortality in countries where healthcare systems are fragile.
According to the 2021 data, diarrhoea accounted for 9% of all deaths in children under 5 - over 1,200 daily, or 440,000 annually.
The following histogram displays the global distribution of child diarrheal mortality in 2021. Each vertical bar represents a specific mortality rate (from 0% to 16%), while its height indicates how many countries fall into that percentage range.
The structure simultaneously reveals three key insights:
Extent of the phenomenon (horizontal position on the scale)
Geographical distribution (color-coded bar segments)
Regional representation (width of colored segments).
The graph clearly demonstrates how diarrheal impact varies dramatically across regions, with a gradient ranging from minimal percentages in developed areas to alarming rates in critical zones.
Mortality is highest in Sub-Saharan Africa.
Countries with diarrhoea-related child mortality, by region (2021)
Code
import pandas as pdimport plotly.graph_objects as godf = pd.read_csv('Deaths caused by diarrhoea 2019 (MCEE 2020) (3).csv', skiprows=4, header=None, names=['country', 'deaths', 'region', 'coordinates', 'country_full', 'year'])df['deaths'] = pd.to_numeric(df['deaths'], errors='coerce')df = df.dropna(subset=['deaths'])region_mapping = {'Europe and Central Asia': 'Europe & Central Asia','Latin America and Caribbean': 'Latin America & Caribbean','Middle East and North Africa': 'Middle East & North Africa','East Asia and Pacific': 'East Asia & Pacific','Sub-Saharan Africa': 'Sub-Saharan Africa','South Asia': 'South Asia','North America': 'North America'}df['region'] = df['region'].map(region_mapping)custom_colors = {'South Asia': '#FFCEE7','Europe & Central Asia': '#FFA8D1','North America': '#FF85BB','Sub-Saharan Africa': '#F364A2','East Asia & Pacific': '#E34F8A','Middle East & North Africa': '#CC4178','Latin America & Caribbean': '#FFB6C1'}fig = go.Figure()for region, color in custom_colors.items(): filtered_df = df[df['region'] == region] fig.add_trace(go.Histogram( x=filtered_df['deaths'], name=region, marker_color=color, nbinsx=20, opacity=0.85, hovertemplate='Region: '+ region +'<br>'+'% of deaths: %{x:.1f}%<br>'+'Number of countries: %{y}<extra></extra>' ))fig.update_layout( barmode='stack', plot_bgcolor='#F5FBFF', paper_bgcolor='#F5FBFF', showlegend=True, legend=dict( title_text='Region', orientation="h", yanchor="bottom", y=-0.25, xanchor="center", x=0.5 ), xaxis=dict( title="Deaths caused by diarrhoea in children under 5 years old (%)", title_standoff=10, tickmode='linear', dtick=2 ), yaxis=dict( title="Count of affected countries, per region", dtick=5 ), bargap=0.1, title=None)fig.show()
Based on GDP per capita, it is possible to identify 10 of the richest countries in the world and 10 of the poorest. Among the latter, the percentage of access to treatment for diarrhea is extremely low, both for boys like me and for girls like my sisters.
Healthcare access for children with diarrhoea (top 10 poorest countries)
Code
import pandas as pddf = pd.read_csv('unicef_metadata_7.csv', usecols=['country', 'year', 'GDP per capita (constant 2015 US$)'])df = df[(df['year'] ==2022)].dropna()top10_high = df.nlargest(10, 'GDP per capita (constant 2015 US$)')['country'].tolist()top10_low = df.nsmallest(10, 'GDP per capita (constant 2015 US$)')['country'].tolist()print("Top 10 Highest GDP per Capita in 2022:", top10_high)print("Top 10 Lowest GDP per Capita in 2022:", top10_low)
Top 10 Highest GDP per Capita in 2022: ['Monaco', 'Bermuda', 'Luxembourg', 'Ireland', 'Switzerland', 'Cayman Islands', 'Norway', 'Singapore', 'United States', 'Qatar']
Top 10 Lowest GDP per Capita in 2022: ['Burundi', 'Afghanistan', 'Central African Republic', 'Madagascar', 'Somalia', 'Congo, the Democratic Republic of the', 'Malawi', 'Niger', 'Chad', 'Mozambique']
Code
# Librariesimport pandas as pdimport plotly.express as px# Load the datasetdf = pd.read_csv("unicef_indicator_1 (2).csv")# List of target countriescountries_of_interest = ['Burundi', 'Afghanistan', 'Central African Republic', 'Madagascar', 'Somalia', 'Congo, the Democratic Republic of the', 'Malawi', 'Niger', 'Chad', 'Mozambique']# Filter dataset: only Male/Female and target countriesdf_filtered = df[ (df["sex"].isin(["Female", "Male"])) & (df["country"].isin(countries_of_interest))]# Calculate yearly averages by sexdf_grouped = df_filtered.groupby(["time_period", "sex"], as_index=False)["obs_value"].mean()# Create line plotfig = px.line( df_grouped, x="time_period", y="obs_value", color="sex", labels={"time_period": "<b>Year</b>","obs_value": "<b>Average Value (%)</b>","sex": "<b>Sex</b>" }, color_discrete_map={"Female": "#FF69B4", # Pink"Male": "#00BFFF"# Blue })# Style improvementsfig.update_traces(mode="lines+markers", line_width=2.5)fig.update_layout( plot_bgcolor='rgba(245, 245, 245, 0.1)', # Very light sandstone background paper_bgcolor='rgba(245, 245, 245, 0.1)', xaxis=dict( tickmode="linear", title_font=dict(color="#1F407A", size=14), # Dark blue bold tickfont=dict(color="#333333") ), yaxis=dict(range=[0, 100], title_font=dict(color="#1F407A", size=14), # Dark blue bold tickfont=dict(color="#333333") ), legend_title_font=dict(color="#1F407A"), # Dark blue legend title legend_font=dict(color="#333333"), # Dark text for legend items hoverlabel=dict( bgcolor="white", font_size=12, font_family="Arial" ))fig.show()
There is a hospital in the next village, but the water from the tap tastes like dirt. My mother says that in richer countries, the water runs clear and doctors always have sterile gloves. I’ve never seen clean water myself, maybe if I had, my stomach wouldn’t hurt like this.
When we finally reached the hospital, the doctors just shook their heads. ‘We don’t have basic water services here,’ they told us. My mother held me tighter, but there was nothing they could do.
In fact, the percentage of healthcare facilities with access to basic water services is not the same across the world.
The lack of access to basic water services means that healthcare facilities are unable to treat children suffering from diarrhoea.
Health care facilities & water access: country comparison 2021
In countries like mine, parents often have large families because they sadly anticipate that some of their children may not survive. This leads to very high birth rates. Since birth rates and life expectancy are inversely related, higher birth rates typically correspond to lower life expectancy at birth.
My mother says that in rich countries, parents have few children and live long enough to become grandparents. Here, instead, who knows if I will even grow up to be as old as my father.
Demographic patterns (2021): Birth rate & Life expectancy
In the following chart, the disparity in birth rates between the poorest countries (pink trend line) and the richest countries (purple trend line) is even more evident.
Birth Rate Trends: High vs Low Rate Countries
Code
import pandas as pdfrom plotnine import ggplot, aes, geom_line, labs, theme_minimal, theme, element_text, element_rect, scale_color_manual# Carica i datidf = pd.read_csv("unicef_metadata_7.csv")# Definisci i gruppi di paesihigh_birth = ["Niger", "Chad", "Somalia", "Central African Republic", "Mali","Congo", "Nigeria", "Uganda", "Mozambique", "Benin"]low_birth = ["South Korea", "Hong Kong", "Puerto Rico", "Japan", "Andorra", "San Marino", "Italy", "China", "Spain", "Greece"]# Assegna etichette personalizzatedf["group"] = df["country"].apply(lambda x: "Top 10 High Birth Rate Countries"if x in high_birth else ("Top 10 Low Birth Rate Countries"if x in low_birth elseNone))# Filtra solo i gruppi rilevantidf_grouped = df[df["group"].notna()]# Elimina righe con valori nullidf_grouped = df_grouped.dropna(subset=["Birth rate, crude (per 1,000 people)"])# Calcola la media annuale per ogni gruppomedia_anni = ( df_grouped .groupby(["year", "group"])["Birth rate, crude (per 1,000 people)"] .mean() .reset_index())# Crea il graficografico = ( ggplot(media_anni, aes(x="year", y="Birth rate, crude (per 1,000 people)", color="group")) + geom_line(size=1.5) + scale_color_manual(values={"Top 10 High Birth Rate Countries": "#FF69B4", # rosa"Top 10 Low Birth Rate Countries": "#800080"# viola }) + labs( x="Year", y="Average Birth Rate (per 1,000 people)", color="Country Group" ) + theme_minimal() + theme( axis_title_x=element_text(color="#1F407A", size=12, weight='bold'), # grassetto axis_title_y=element_text(color="#1F407A", size=12, weight='bold'), # grassetto legend_title=element_text(size=11), legend_text=element_text(size=10), figure_size=(8, 6), panel_background=element_rect(fill="#F5FBFF", color=None) # sfondo azzurro chiarissimo ))grafico
In places like mine, where wealth is scarce, families have many children, not by choice, but because they lack the resources to provide for them.
In wealthier countries, parents can afford to care for fewer children, offering them more opportunities and better care. There, families are small and everyone smiles.
Here, the scarcity of resources means more children with fewer chances for a long, healthy life. Here, adults say, “We have many children because the sky will take some of them.” But I hope the sky won’t take any of us.
GDP per capita and its effect on birth rate
Code
import pandas as pdimport plotly.express as px# Carica il datasetdf = pd.read_csv("unicef_metadata_7.csv")# Filtra i dati per l'anno 2022 e puliscidf_2022 = df[df["year"] ==2022]df_cleaned = df_2022.dropna(subset=["GDP per capita (constant 2015 US$)", "Birth rate, crude (per 1,000 people)"])df_cleaned["Birth rate, crude (per 1,000 people)"] = df_cleaned["Birth rate, crude (per 1,000 people)"].round(1)# Crea il grafico con le personalizzazioni richiestefig = px.scatter( df_cleaned, x="GDP per capita (constant 2015 US$)", y="Birth rate, crude (per 1,000 people)", labels={"GDP per capita (constant 2015 US$)": "<b>GDP per capita (USD)</b>","Birth rate, crude (per 1,000 people)": "<b>Birth rate (per 1,000 people)</b>" }, color_discrete_sequence=["#FDB79A"], # Colore rosa per i punti trendline="lowess", trendline_color_override="#FF69B4"# Linea viola)# Personalizzazione avanzatafig.update_traces( mode='markers', marker=dict( size=8, opacity=0.7, line=dict(width=1, color='DarkSlateGrey') ), selector=dict(mode='markers'))# Migliora l'aspetto della linea di tendenzafig.update_traces( line=dict(width=4), selector=dict(type='scatter', mode='lines'))# Aggiorna il layout con le nuove specifichefig.update_layout( plot_bgcolor='#F5FBFF', # Colore sfondo personalizzato paper_bgcolor='#F5FBFF', # Colore area grafico xaxis_title="<b>GDP per capita (USD)</b>", yaxis_title="<b>Birth rate (per 1,000 people)</b>", template="plotly_white", font=dict( family="Arial", size=12, ), hovermode="closest", showlegend=False, xaxis=dict(range=[0, 100000], tickvals=[0, 20000, 40000, 60000, 80000, 100000], tickformat=",", title_font=dict(color="#1F407A", size=14), # Asse X blu scuro e grassetto tickfont=dict(color="#333333") ), yaxis=dict(range=[0, 45], tickvals=[0, 5, 10, 15, 20, 25, 30, 35, 40, 45], title_font=dict(color="#1F407A", size=14), # Asse Y blu scuro e grassetto tickfont=dict(color="#333333") ))# Aggiungi annotazione fonte datifig.add_annotation( x=0.5, y=-0.15, xref="paper", yref="paper", text="Fonte: Dati UNICEF 2022", showarrow=False, font=dict( size=10, color="grey" ))fig.show()
Saving children from preventable deaths like diarrhoea requires better healthcare access and hygiene in vulnerable communities.
Your UNICEF donation can save lives and keep hope alive for those still fighting.